package ig.util.ui;
import ig.util.excepciones.DatoInvalidoExcepcion;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;

/**
 * Define la estructura interna, metodos y componentes de una pantalla tipo
 * Wizzard. 
 * TODO reestructurar esta clase y hacerla mas parecida a WizzardSevinproPanel.
 * @author lfgarcia
 */
public abstract class WizzardPanel extends JPanel {

	//Atributos de la interfaz grafica
    private JLabel lblTitulo = new JLabel();
	private JComponent panelMedio = new JPanel();
	private JPanel panelInferior = new JPanel();
		private JButton btnAnterior = new JButton();
		private JButton btnSiguiente = new JButton();
		private JButton btnAceptar = new JButton();
		private JButton btnCancelar = new JButton();
		
	//Atributos del comportamiento del componente
	/** Numero de la pantalla actual que despliega el wizzard. */
	protected int pantallaActual = 0;
	/**
	 * Pantallas que conforman el wizzard. 
	 * poseidon-type JComponent 
	 */
	protected ArrayList pantallas;
	protected JFrame frame;
	
	/**
	 * Constructor de la clase.
	 * @param pantallas Conjunto de pantallas que conforman el wizzard.
	 * @throws DatoInvalidoExcepcion Si el conjunto de pantallas es nulo o no posee pantallas.
	 */
	public WizzardPanel(ArrayList pantallas) throws DatoInvalidoExcepcion {
		if (pantallas==null)
			throw new DatoInvalidoExcepcion("Falta por definir pantallas para el Wizzard.");
		
		if (pantallas.size()==0)
			throw new DatoInvalidoExcepcion("Falta por definir pantallas para el Wizzard.");
		
        initGUI();
                
        this.pantallas = pantallas;
        
        int contador=0;
        Iterator i = pantallas.iterator();
        while (i.hasNext()){        	
        	panelMedio.add( (Component) i.next(), contador+"" );
        	contador++;
        }
        
    	CardLayout c = (CardLayout)panelMedio.getLayout();
    	c.show( panelMedio, "0" );
    	
        btnAnterior.setEnabled(false);        
        if (pantallas.size()==1)
        	btnSiguiente.setEnabled(false);
    }

	/**
	 * Inicializa los componentes de la interfaz grafica de usuario.
	 */
    private void initGUI() {
    	setLayout(new BorderLayout());

    	add(lblTitulo, BorderLayout.NORTH);
	        lblTitulo.setText("IG-Metrica");
	        lblTitulo.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
        add(panelMedio, BorderLayout.CENTER);
        	panelMedio.setLayout( new CardLayout() );
	        panelMedio.setBorder(BorderFactory.createEmptyBorder(15, 10, 0, 10));	        
        add(panelInferior, BorderLayout.SOUTH);
        panelInferior.setLayout(new FlowLayout(FlowLayout.TRAILING));
//        panelInferior.setBorder(BorderFactory.createEmptyBorder(10, 0, 15, 30));
        	//Adicionando boton Anterior
        	panelInferior.add(btnAnterior);
        	btnAnterior.setText("<< Anterior");
        	btnAnterior.setMnemonic('N');
        	btnAnterior.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnAnteriorActionPerformed(e);}});
        	//Adicionando boton Siguiente
        	panelInferior.add(btnSiguiente);
        	btnSiguiente.setText("Siguiente >>");
			btnSiguiente.setMnemonic('S');
			btnSiguiente.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnSiguienteActionPerformed(e);}});
        	//Adicionando boton Aceptar
        	panelInferior.add(btnAceptar);
        	btnAceptar.setText("Aceptar");
        	btnAceptar.setMnemonic('A');
        	btnAceptar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnAceptarActionPerformed(e);}});
        	//Adicionando boton Cancelar
            panelInferior.add(btnCancelar);
            btnCancelar.setText("Cancelar");
            btnCancelar.setMnemonic('C');
            btnCancelar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){btnCancelarActionPerformed(e);}});
    }

    /**
     * Metodo que se ejecuta al hacer clic en el boton Anterior del wizzard.
     * Solo en un caso muy particular esta funcion debe llegar a redefinirse.
     * @param e
     */
    public void btnAnteriorActionPerformed(ActionEvent e) { 
    	pantallaActual--;
        
    	CardLayout c = (CardLayout)panelMedio.getLayout();
    	c.show( panelMedio, pantallaActual+"" );
    	    	
    	if (btnSiguiente.isEnabled()==false)
    		btnSiguiente.setEnabled(true);
    	if (pantallaActual == 0)
    		btnAnterior.setEnabled(false);
    	
    }

    /**
     * Metodo que se ejecuta al hacer clic en el boton Siguiente del wizzard.
     * Solo en un caso muy particular esta funcion debe llegar a redefinirse.
     * @param e
     */
    public void btnSiguienteActionPerformed(ActionEvent e) { 
    	pantallaActual++;

    	CardLayout c = (CardLayout)panelMedio.getLayout();
    	c.show( panelMedio, pantallaActual+"" );
    	    	
    	if (btnAnterior.isEnabled()==false)
    		btnAnterior.setEnabled(true);
    	if (pantallaActual >= pantallas.size()-1)
    		btnSiguiente.setEnabled(false);
    	
    }

    /**
     * Metodo que se ejecuta al hacer clic en el boton Aceptar del wizzard.
     * Para cada wizzard este metodo debe redefinirse para especificar el 
     * comportamiento o el proceso a ejecutarse cuando se acepten las pantallas
     * del wizzard y sus respectivos valores.
     * @param e
     */
    public abstract void btnAceptarActionPerformed(ActionEvent e);

    /**
     * Metodo que se ejecuta al hacer clic en el boton Cancelar del wizzard.
     * Solo en un caso muy particular esta funcion debe llegar a redefinirse.
     * @param e
     */
    public void btnCancelarActionPerformed(ActionEvent e) { 
    	System.exit(0);
    }

}
